/**
 * 处理URL的工具函数
 * 提供统一的方式来打开外部链接
 */

/**
 * 获取外部链接打开方式配置
 * @returns 打开方式，'browser' 或 'internal'
 */
export function getExternalLinkOpenMode(): string {
  try {
    // 先从本地存储获取设置
    const generalSettings = localStorage.getItem('general-settings');
    if (generalSettings) {
      const parsedSettings = JSON.parse(generalSettings);
      if (parsedSettings.externalLinkOpenMode) {
        return parsedSettings.externalLinkOpenMode;
      }
    }
    // 如果本地存储中没有，使用默认值
    return 'browser';
  } catch (error) {
    console.error('获取外部链接打开方式配置失败:', error);
    return 'browser'; // 默认使用浏览器打开
  }
}

/**
 * 使用系统默认浏览器打开外部链接
 * 首先尝试直接打开，如果失败则尝试通过IPC通道打开
 * 
 * @param url 要打开的URL
 * @returns Promise对象，成功返回void，失败抛出错误
 */
export async function openExternalUrl(url: string): Promise<void> {
  try {
    // 获取打开方式配置
    const openMode = getExternalLinkOpenMode();
    
    // 根据配置选择打开方式
    if (openMode === 'browser') {
      // 使用本地浏览器打开
      try {
        // 首先尝试直接使用openExternal打开
        await window.electronShell.openExternal(url);
        return; // 如果成功，直接返回
      } catch (directError) {
        console.log('直接打开URL失败，尝试通过IPC通道打开:', directError);
        
        // 如果直接打开失败，尝试通过IPC通道打开
        const result = await window.electronShell.openExternalViaIpc(url);
        if (!result.success) {
          throw new Error(result.error || '打开链接失败');
        }
      }
    } else if (openMode === 'internal') {
      // 在应用内打开
      // 创建一个新窗口或使用BrowserView
      // 注意：这里需要通过IPC调用主进程创建窗口
      const result = await window.electronAPI.openInternalWindow(url);
      if (!result.success) {
        throw new Error(result.error || '在应用内打开链接失败');
      }
    } else {
      // 未知的打开方式，使用默认浏览器打开
      await window.electronShell.openExternalViaIpc(url);
    }
  } catch (error) {
    console.error('打开外部URL失败:', error);
    throw error; // 将错误向上传播，让调用者可以进行处理
  }
}

/**
 * 检查字符串是否是有效的URL
 * 
 * @param str 要检查的字符串
 * @returns 是否是有效的URL
 */
export function isValidUrl(str: string): boolean {
  try {
    new URL(str);
    return true;
  } catch {
    return false;
  }
} 